import { AccountData } from '../account/account.data';
import {Cache, ICache} from './cache';
import {Token} from "./base.data";

export enum Region {
    system
}

/**
 * 缓存管理器类
 * @author 王锦阳
 * @version 1.0
 * @since 2016-09-01
 */
export class CacheManage {

    private _cacheManages: any = {};

    constructor() {
        this._cacheManages[Region[Region.system]] = new Cache();
    }

    /**
     * 根据指定分区获取缓存的函数
     * @param region 缓存分区
     * @returns {ICache} 返回缓存对象
     */
    private getCache(region: Region): ICache {
        const cache: ICache = this._cacheManages[Region[region]];
        return (cache instanceof Cache) ? cache : null;
    }

    /**
     * 获取玩家信息的函数
     * @returns {AccountData} 返回玩家信息
     */
    public getUser(): AccountData {
        return <AccountData> this.getCache(Region.system).getObject(`_CACHE_USER_INFO_`);
    }

    /**
     * 设置玩家信息的函数
     * @param value 玩家信息
     * @returns {CacheManage} 返回缓存管理器对象
     */
    public setUser(value: AccountData): CacheManage {
        this.getCache(Region.system).put("_CACHE_USER_INFO_", value);
        return this;
    }

    /**
     * 获取令牌信息的函数
     * @returns {AccountData} 返回令牌信息
     */
    public getToken(): Token {
        return <Token> this.getCache(Region.system).getObject(`_CACHE_TOKEN_INFO_`);
    }

    /**
     * 设置令牌信息的函数
     * @param value 令牌信息
     * @returns {CacheManage} 返回缓存管理器对象
     */
    public setToken(value: Token): CacheManage {
        this.getCache(Region.system).put("_CACHE_TOKEN_INFO_", value);
        return this;
    }

    /**
     *  根据指定分区和缓存KEY获取系统数据缓存值的函数
     * @param key 缓存KEY
     * @param popElement 是否弹出元素（true：弹出，false：不弹出[默认]）
     * @returns {object} 返回系统数据的缓存值
     */
    public getSystem(key: string, popElement: boolean = false): any {
        if (popElement) {
            return this.getCache(Region.system).remove(`_CACHE_PAGE_SYSTEM_${key.toUpperCase()}_`);
        }
        return this.getCache(Region.system).getObject(`_CACHE_PAGE_SYSTEM_${key.toUpperCase()}_`);
    }

    /**
     * 根据指定缓存KEY保存系统数据的函数
     * @param key 缓存KEY
     * @param value 系统数据
     * @returns {CacheManage} 返回缓存管理器对象
     */
    public setSystem(key: string, value: any): CacheManage {
        this.getCache(Region.system).put(`_CACHE_PAGE_SYSTEM_${key.toUpperCase()}_`, value);
        return this;
    }

    /**
     * 根据指定缓存KEY移除Widget组件对象的函数
     * @param key 缓存KEY
     * @return {object} 返回被移除的Widget类型的缓存值
     */
    public removeSystem(key: string): object {
        return this.getSystem(key.toUpperCase(), true);
    }

}

/**
 * 全局缓存对象
 * @type {CacheManage}
 */
export const globalCache: CacheManage = new CacheManage();
Object.freeze(globalCache);
